package util;

import entidades.Usuario;
import excessoes.DAOException;
import excessoes.FabricaDAOException;
import fabricas.PropertiesFabrica;
import java.util.Properties;
import javax.faces.application.FacesMessage;
import org.apache.commons.lang3.RandomStringUtils;
import org.apache.commons.mail.EmailException;
import org.apache.commons.mail.MultiPartEmail;
import rn.UsuarioRN;

/**
 *
 * @author marcelo
 */
public class EnviaEmail
{
    private final String ARQUIVO = FacesUtil.getServletContext().getRealPath("/WEB-INF/sispac.properties");
    private Usuario usuario = new Usuario();
    private Properties propriedades;
    private EncriptaSenha jasytEncriptDecript; 
    private final String usuarioEmail; //usuário da autenticação do emailUsuario
    //private final String emailUsuario; // emailUsuario do usuario cadastrado na tabela de usuários
    private final String porta;
    private final String servidorSmtp;
    private final String remetente;
    private final String nomeRemetente;
    private final String senhaEmail;
    private final String tls;
    private final String ssl;

    public EnviaEmail() throws FabricaDAOException
    {
        this.propriedades = PropertiesFabrica.lePropertiesJsf(ARQUIVO);
        this.jasytEncriptDecript = new EncriptaSenha();
        this.usuarioEmail = this.propriedades.getProperty("USUARIOEMAIL").trim();
        this.porta = this.propriedades.getProperty("PORTA").trim();
        this.servidorSmtp = this.propriedades.getProperty("SERVIDORSMTP").trim();
        this.remetente = this.propriedades.getProperty("REMETENTE").trim();
        this.nomeRemetente = this.propriedades.getProperty("NOMEREMETENTE").trim();
        this.senhaEmail = this.jasytEncriptDecript.decifrar(this.propriedades.getProperty("SENHAEMAIL").trim());
        this.tls = propriedades.getProperty("TLS");
        this.ssl = propriedades.getProperty("SSL");
        
    }

    public Usuario getUsuario() {
        return usuario;
    }

    public void setUsuario(Usuario usuario) {
        this.usuario = usuario;
    }
    
    public void enviaEmailRecuperacao(Integer saramDestinatario, String emailDestinatario) throws FabricaDAOException, DAOException, Exception
    {
        try 
        {
            UsuarioRN usuarioRN = new UsuarioRN();
            this.usuario = usuarioRN.buscarPorSaram(saramDestinatario);
        
            if (this.usuario == null ) {
                FacesUtil.getFacesContext().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_WARN, "Saram não encontrado!", "")); //Não colocar \n para pular a linha. O Growl Messages global não funciona. 
            }
            else
            {
                String login = this.usuario.getLogin();
                Integer saram = this.usuario.getSaram();
                String emailUsuario = this.usuario.getPessoa().getEmailComercial();
                
                if (saramDestinatario > 0 || emailDestinatario != null) 
                {
                    if (saramDestinatario != saram.intValue()) { 
                        FacesUtil.getFacesContext().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, "Saram inexistente!", ""));
                    }
                
                    if (!emailDestinatario.equalsIgnoreCase(emailUsuario)) {
                        FacesUtil.getFacesContext().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, "Email não encontrado para o saram informado!", ""));
                    }
                    
                    if ((saramDestinatario == saram.intValue()) && (emailDestinatario.equalsIgnoreCase(emailUsuario))) 
                    {
                        /*
                        SecureRandom secureRandom = new SecureRandom();
                        byte bytes[] = new byte[8];
                        secureRandom.nextBytes(bytes);
                        System.out.println("A SENHA RANDOMICA É: "+bytes);
                        */
                        //Método que gera senha aleatória e salvar no banco a nova senha
                        String novaSenha = RandomStringUtils.randomAlphanumeric(8); 
                        this.usuario.setSenha(novaSenha);
                        usuarioRN.atualizarSenhaRecuperacao(this.usuario);
                        String corpoEmail = "SISPAC - Sistema de Pagamento de Auxiliares Civis\n\n".concat("O seu login é: ").concat(login).concat("\n").concat("A sua nova senha é: ".concat(novaSenha)).concat("\n\n").concat("Assessoria de Controle Interno").concat("\n").concat("Subdiretoria de Pagamento de Pessoal");
                    
                        // Monta o email
                        MultiPartEmail email = new MultiPartEmail();
                        email.addTo(emailUsuario);
                        email.setHostName(this.servidorSmtp); // o servidor SMTP para envio do e-mail
                        email.setFrom(this.remetente, this.nomeRemetente); // remetente
                        email.setSubject("Recuperação de Acesso"); // assunto do e-mail
                        email.setMsg(corpoEmail); //conteudo do e-mail
                        email.setAuthentication(this.usuarioEmail, this.senhaEmail); //Seu nome de usuário e senha
                        email.setSmtpPort(Integer.valueOf(this.porta));
                        email.setSSL(Boolean.valueOf(this.ssl));
                        email.setTLS(Boolean.valueOf(this.tls));
                        email.send(); //envia o e-mail
                        FacesUtil.getFacesContext().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO, "E-mail enviado com sucesso!", ""));
                        //FacesUtil.getFacesContext().addMessage(null, new FacesMessage("E-mail enviado com sucesso!"));
                        //throw new FabricaDAOException("Email enviado com sucesso!", "aviso");
                    }
                }
            }
        }
        catch (EmailException e) {
            FacesUtil.getFacesContext().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, "Não foi possível enviar o email!", ""));
            //FacesUtil.getFacesContext().addMessage(null, new FacesMessage("Não foi possível enviar o email!\n"+e.getMessage()));
        }
    }

    public String verificaDadosEnvio() 
    {
        if (this.servidorSmtp == null || this.servidorSmtp.equals("")) {
            FacesUtil.getFacesContext().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, "Não foi possível enviar o email!", "Servidor Smtp inválido ou não configurado."));
            return "erro";
        }

        if(this.remetente == null || this.remetente.equals("")) {
            FacesUtil.getFacesContext().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, "Não foi possível enviar o email!", "Remetente inválido ou não configurado."));
            return "erro";
        }

        /*
        if(assuntoemail == null || assuntoemail.equals("")) {
            FacesUtil.getFacesContext().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, "Não foi possível enviar o email!", "O campo Assunto não pode ser nulo."));
            return "erro";
        }

        if(corpoemail == null || corpoemail.equals("")) {
            FacesUtil.getFacesContext().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, "Não foi possível enviar o email!", "O campo Mensagem não pode ser nulo."));
            return "erro";
        }
        */
        if((this.usuarioEmail == null || this.usuarioEmail.equals("")) || (this.senhaEmail == null || this.senhaEmail.equals(""))) {
            FacesUtil.getFacesContext().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, "Não foi possível enviar o email!", "Usuário ou senha inválidos ou não configurados."));
            return "erro";
        }

        if(this.porta == null || this.porta.equals("")) {
            FacesUtil.getFacesContext().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, "Não foi possível enviar o email!", "Porta Smtp inválida ou não configurada."));
            return "erro";
        }

        if(this.ssl == null || this.ssl.equals("false")) {
            FacesUtil.getFacesContext().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, "Não foi possível enviar o email!", "Ssl inválido ou não configurado."));
            return "erro";
        }

        if(this.tls == null || this.tls.equals("false")) {
            FacesUtil.getFacesContext().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, "Não foi possível enviar o email!", "Tls inválido ou não configurado."));
            return "erro";
        }

        if(this.nomeRemetente == null || this.nomeRemetente.equals("")) {
            FacesUtil.getFacesContext().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, "Não foi possível enviar o email!", "Nome do remetente inválido ou não configurado."));
            return "erro";
        }
        return "ok";
    }
}
